/**
 * WebSocket管理器 - 微信小程序版
 * 
 * 功能：
 * - 自动连接和重连
 * - 心跳保活
 * - 消息事件分发
 * - 连接状态管理
 */
class WebSocketManager {
  private socketTask: UniApp.SocketTask | null = null
  private url: string = 'ws://localhost:8081/ws'
  private reconnectTimer: any = null
  private heartbeatTimer: any = null
  private messageHandlers: Map<string, Function[]> = new Map()

  /**
   * 连接WebSocket服务器
   * 
   * @param token 认证Token，用于鉴权
   */
  connect(token: string) {
    if (this.socketTask) {
      this.socketTask.close({})
    }

    this.socketTask = uni.connectSocket({
      url: `${this.url}?token=${token}`,
      success: () => {
        console.log('WebSocket连接成功')
      },
      fail: (error) => {
        console.error('WebSocket连接失败', error)
        this.reconnect(token)
      }
    })

    this.socketTask.onOpen(() => {
      console.log('WebSocket已打开')
      this.startHeartbeat()
    })

    this.socketTask.onMessage((res) => {
      try {
        const data = JSON.parse(res.data as string)
        this.handleMessage(data)
      } catch (error) {
        console.error('消息解析失败', error)
      }
    })

    this.socketTask.onError((error) => {
      console.error('WebSocket错误', error)
    })

    this.socketTask.onClose(() => {
      console.log('WebSocket已关闭')
      this.stopHeartbeat()
      this.reconnect(token)
    })
  }

  /**
   * 发送消息
   * 
   * @param message 要发送的消息对象
   */
  send(message: any) {
    if (this.socketTask) {
      this.socketTask.send({
        data: JSON.stringify(message),
        fail: (error) => {
          console.error('发送消息失败', error)
        }
      })
    }
  }

  /**
   * 注册事件监听器
   * 
   * @param event 事件类型
   * @param handler 事件处理函数
   */
  on(event: string, handler: Function) {
    if (!this.messageHandlers.has(event)) {
      this.messageHandlers.set(event, [])
    }
    this.messageHandlers.get(event)?.push(handler)
  }

  /**
   * 移除事件监听器
   * 
   * @param event 事件类型
   * @param handler 要移除的处理函数，不传则移除所有
   */
  off(event: string, handler?: Function) {
    if (!handler) {
      this.messageHandlers.delete(event)
    } else {
      const handlers = this.messageHandlers.get(event)
      if (handlers) {
        const index = handlers.indexOf(handler)
        if (index > -1) {
          handlers.splice(index, 1)
        }
      }
    }
  }

  /**
   * 断开WebSocket连接
   */
  disconnect() {
    if (this.socketTask) {
      this.socketTask.close({})
      this.socketTask = null
    }
    this.stopHeartbeat()
    if (this.reconnectTimer) {
      clearTimeout(this.reconnectTimer)
    }
  }

  /**
   * 处理接收到的消息
   * 根据消息类型分发给对应的监听器
   */
  private handleMessage(data: any) {
    const handlers = this.messageHandlers.get(data.type) || []
    handlers.forEach(handler => handler(data))
  }

  /**
   * 自动重连
   * 在连接断开后3秒后尝试重新连接
   */
  private reconnect(token: string) {
    if (this.reconnectTimer) {
      clearTimeout(this.reconnectTimer)
    }
    this.reconnectTimer = setTimeout(() => {
      console.log('尝试重新连接WebSocket')
      this.connect(token)
    }, 3000)
  }

  /**
   * 启动心跳
   * 每30秒发送一次心跳包，保持连接活跃
   */
  private startHeartbeat() {
    this.heartbeatTimer = setInterval(() => {
      this.send({ type: 'HEARTBEAT' })
    }, 30000)
  }

  /**
   * 停止心跳
   */
  private stopHeartbeat() {
    if (this.heartbeatTimer) {
      clearInterval(this.heartbeatTimer)
      this.heartbeatTimer = null
    }
  }
}

export const wsManager = new WebSocketManager()
export default wsManager
